/**
 * 
 */
package fr.toto.triseries;

import java.awt.Desktop;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.nio.charset.Charset;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.Properties;
import java.util.concurrent.Phaser;

import fr.toto.constantes.Constantes;
import fr.toto.logging.Login;

/**
 * @author tshepo
 * 
 */
public class Reglages implements Constantes {

	private static String EXTENTIONS = "";


	private static String USER;
	private static String TOKEN;
	private static String MDP = "";
	private static String[] SCANDIRS = {};
	private static String[] DESTDIRS = {};
	private static boolean REC = false;

	private static String FORMAT = "";
	private static String LANGSUBS = "";
	private static boolean DEBUG = true;

	public static String SUBKEEPONLY = "";
	public static String SUBSKIPALWAYS;

	public static boolean SERVEUR = true;
	public static int PORT = 8080;
	
	public static String getUser() {
		return USER;
	}

	public static String getToken() {
		return TOKEN;
	}

	public static String getFormat() {
		if (FORMAT.isEmpty())
			FORMAT = "{SERIE}/saison {SAISON:1}/{SERIE} - {SAISON:2}x{EPISODE:2} - {GLOBAL:3} - {TITRE}";
		return FORMAT;
	}

	public static String[] GetDirsToScan() {
		if(DESTDIRS[0] == null || DESTDIRS[0].isEmpty() || SCANDIRS == null || SCANDIRS[0].isEmpty())
			return null;
		return SCANDIRS;
	}

	public static String GetDirToMoveFile() {
		return DESTDIRS[0];
	}

	public static String[] GetDirsToFiles() {
		return DESTDIRS;
	}
	
	public static boolean isRecursiveScan() {
		return REC;
	}
	
	public static String getExtsRegex() {
		return "(" + EXTENTIONS.replace(",", "|") + "|" + EXTENTIONS.toUpperCase().replace(",","|") + ")$";
	}

	public static String getExtsGlob() {
		return ".{" + EXTENTIONS + "," + EXTENTIONS.toUpperCase()+"}";
	}

	
	

	public static boolean WatchDirAllowed() {
		if (SCANDIRS.length == 0)
			return false;
		if (Paths.get(DESTDIRS[0]).isAbsolute())
			return true;
		return false;
	}

	public static boolean Init() {
		Properties configFile = new Properties();
		try {
			if (!(Files.exists(SETTINGSPATH))) {
				Files.createDirectories(SETTINGSPATH.getParent());
				if (connect()) {
					WriteSettings();
					editProperties();
				}
				else return false;
			}
			configFile.load(new InputStreamReader(new FileInputStream(
					SETTINGSPATH.toString()), CharsetName));

			USER = configFile.getProperty("user");
			
			TOKEN = configFile.getProperty("token");
			
			
			MDP = configFile.getProperty("password","");

			SCANDIRS = configFile.getProperty("scandirs").split(
					File.pathSeparator);
			REC = configFile.getProperty("recursif", "false").trim()
                    .equalsIgnoreCase("true");
			DESTDIRS = configFile.getProperty("destdirs").split(
					File.pathSeparator);

			FORMAT = configFile.getProperty("format");
			LANGSUBS = configFile.getProperty("destdirs","VOVF");
			
			EXTENTIONS = configFile.getProperty("exts","avi,mp4,mkv");
			
			SERVEUR = configFile.getProperty("webUI", "false").trim()
                    .equalsIgnoreCase("true");
			try {
			PORT = Integer.parseInt(configFile.getProperty("webUI-port", "8080").trim(),10);		
			} catch (NumberFormatException e) {
				PORT = 8080;
			}
						
			SUBKEEPONLY = configFile.getProperty("subtitle-only-with","srt$");
			SUBSKIPALWAYS = configFile.getProperty("subtitle-skip-when","\\WTAG\\W|ass$");
			
			if (TOKEN.isEmpty()) reConnect();

		} catch (Exception ex) {
			if(DEBUG) ex.printStackTrace();
			return false;
		}
		return true;
	}

	public static boolean connect() {
		Phaser phaser = new Phaser();
		phaser.register();
		Login log = new Login(phaser);
		
		phaser.arriveAndAwaitAdvance();
		
		USER = log.getUserName();
		TOKEN = log.getToken();
		
		return  !log.failed();
	}
	
	
	
	private static void WriteSettings() throws Exception {

		ArrayList<String> fileArray = new ArrayList<String>();
		fileArray.add("\n\r# Pseudo betaseries");
		fileArray.add("user=" +USER);

		fileArray.add("# token d'indentification");
		fileArray.add("token=" + TOKEN);
		if(!MDP.isEmpty())
			fileArray.add("password=" + MDP);
		fileArray.add("");
		fileArray.add("# dossier(s) à scanner");
		fileArray
				.add("# Utilisateurs Windows : Doubler  les \\ et séparer chaque chemins par un point virgule");
		fileArray
				.add("# ex : d:\\\\Documents\\\\Téléchargements;c:\\\\Téléchargements");
		fileArray.add("# Utilisateurs linux : séparer chaque chemins par :");
		String scans = "";
		for (String s : SCANDIRS)
			scans += (s + File.pathSeparator);
		fileArray.add("scandirs=" + scans);
		fileArray.add("Lecture du(des) dossier(s) récursive, true/false");
		fileArray.add("recursif="+ REC);		
		fileArray.add("");
		fileArray.add("# dossier(s) de destination");
		String dirs = "";
		for (String s : DESTDIRS)
			dirs += (s + File.pathSeparator);
		fileArray.add("destdirs=" + dirs);
		fileArray.add("");
		fileArray.add("# Format du fichier de sortie");
		fileArray.add("# utiliser les codes suivants :");
		fileArray.add("# - {SERIE} pour le nom de la serie");
		fileArray.add("# - {SAISON:x} pour le numéro de la Saison, x = 1 ou 2 = nombre de chiffres");
		fileArray.add("# - {EPISODE:x} pour le numéro de l'épisode, x = 1 ou 2 = nombre de chiffres");
		fileArray.add("# - {GLOBAL:x} pour le numéro global de l'épisode, x = 1, 2 ou 3 = nombre de chiffres");
		fileArray.add("# - {TITRE} pour le titre de l'épisode");
		fileArray.add("# Exemples linux:");
		fileArray.add("# format={SERIE}.s{SAISON:2}/{GLOBAL:3}.{SERIE}.{SAISON:1}x{EPISODE:1}");
		fileArray.add("# Exemples windows:");
		fileArray.add("# format={SERIE}\\{SERIE}_S{SAISON:2}E{EPISODE:2}_{TITRE}");
		fileArray
				.add("# format={SERIE} - saison {SAISON:1}\\{SERIE} - {SAISON:1}x{EPISODE:2} - {TITRE}");
		fileArray.add("format=" + getFormat());
		fileArray.add("");
		fileArray.add("# Choix des Soutitres VO, VF, VOVF (par défaut) ou NONE");
		fileArray.add("languesub="+LANGSUBS);
		fileArray.add("");
		fileArray.add("# Utilisation d'une interface Web pour lancer les vidéos, true/false");
		fileArray.add("webUI="+ SERVEUR);				
		fileArray.add("webUI-port="+PORT);
		fileArray.add("");
		fileArray.add("# Attention ! la modification des données suivantes est déconseillé");
		fileArray.add("");
		fileArray.add("# Extentions Vidéos");
		if(EXTENTIONS.isEmpty()) EXTENTIONS = "avi,mp4,mkv";
		fileArray.add("exts="+EXTENTIONS);
		fileArray.add("");
		fileArray.add("# Accepte que les soustitres concordant avec cette expression régulière");
		if(SUBKEEPONLY.isEmpty()) SUBKEEPONLY = "srt$";
		fileArray.add("subtitle-only-with="+ SUBKEEPONLY);
		fileArray.add("");
		fileArray.add("# Refuse tous les soustitres concordant avec cette expression régulière");
		if(SUBSKIPALWAYS == null) SUBSKIPALWAYS = "\\WTAG\\W|ass$";
		fileArray.add("subtitle-skip-when="+ SUBSKIPALWAYS);
		fileArray.add("");
		fileArray.add("");

		Files.write(SETTINGSPATH, fileArray, Charset.forName(CharsetName));
	}
	
	public static void editProperties() throws IOException {
		
		Desktop d = Desktop.getDesktop();
		if(d.isSupported(Desktop.Action.EDIT))
			d.edit(SETTINGSPATH.toFile());
		else if(d.isSupported(Desktop.Action.OPEN))
			d.open(SETTINGSPATH.toFile());
	}

	public static Properties initSeriesFile() {
		Properties seriesFile = new Properties();
		try {
			seriesFile.load(new InputStreamReader(new FileInputStream(
					LISTSHOWPATH.toString()), CharsetName));
		} catch (Exception e) {
			return new Properties();
		}
		return seriesFile;
	}

	public static String getLangueSub() {
		if (LANGSUBS.equalsIgnoreCase("VO")) return "VO";
		if (LANGSUBS.equalsIgnoreCase("VF")) return "VF";
		if (LANGSUBS.equalsIgnoreCase("NONE")) return null;
		return "VOVF";
	}

	public static void reConnect() {
		if (connect())
			try {
				WriteSettings();
			} catch (Exception e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		else
			System.exit(0);
	}
}
